Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/component/SecurityIcon.kt 01cd54907d62cd90913d3d071b6bc240cae365ef (01cd5490) Text, 23.02 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tf0883e@fileTb4b4b4:Te6edf3SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)

Tff7b72package T7ee787org.meshtastic.core.ui.component

Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.Spacer
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.height
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.layout.size
Tff7b72import T7ee787androidx.compose.foundation.rememberScrollState
Tff7b72import T7ee787androidx.compose.foundation.verticalScroll
Tff7b72import T7ee787androidx.compose.material3.AlertDialog
Tff7b72import T7ee787androidx.compose.material3.Badge
Tff7b72import T7ee787androidx.compose.material3.BadgedBox
Tff7b72import T7ee787androidx.compose.material3.HorizontalDivider
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.IconButton
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme.colorScheme
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TextButton
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.Immutable
Tff7b72import T7ee787androidx.compose.runtime.Stable
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.saveable.rememberSaveable
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.graphics.vector.ImageVector
Tff7b72import T7ee787androidx.compose.ui.tooling.preview.Preview
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787org.jetbrains.compose.resources.DrawableResource
Tff7b72import T7ee787org.jetbrains.compose.resources.StringResource
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.jetbrains.compose.resources.vectorResource
Tff7b72import T7ee787org.meshtastic.core.model.Channel
Tff7b72import T7ee787org.meshtastic.core.model.util.getChannel
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.ic_lock
Tff7b72import T7ee787org.meshtastic.core.resources.ic_lock_open
Tff7b72import T7ee787org.meshtastic.core.resources.ic_warning
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_badge_warning_description
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_description
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_help_dismiss
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_help_green_lock
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_help_red_open_lock
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_help_show_all
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_help_show_less
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_help_title
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_help_title_all
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_help_warning_precise_mqtt
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_help_yellow_open_lock
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_insecure_no_precise
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_insecure_precise_only
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_secure
Tff7b72import T7ee787org.meshtastic.core.resources.security_icon_warning_precise_mqtt
Tff7b72import T7ee787org.meshtastic.core.ui.theme.AppTheme
Tff7b72import T7ee787org.meshtastic.core.ui.theme.StatusColors.StatusGreen
Tff7b72import T7ee787org.meshtastic.core.ui.theme.StatusColors.StatusRed
Tff7b72import T7ee787org.meshtastic.core.ui.theme.StatusColors.StatusYellow
Tff7b72import T7ee787org.meshtastic.proto.ChannelSet
Tff7b72import T7ee787org.meshtastic.proto.ChannelSettings
Tff7b72import T7ee787org.meshtastic.proto.Config.LoRaConfig

Tff7b72private Tff7b72const Tff7b72val Te6edf3PRECISE_POSITION_BITS Tff7b72= T79c0ff3T79c0ff2

T8b949e/**
* Represents the various visual states of the security icon as an enum. Each enum constant encapsulates the icon,
* color, descriptive text, and optional badge details.
*
* @property icon The primary vector graphic for the icon.
* @property color The tint color for the primary icon.
* @property descriptionResId The string resource ID for the accessibility description of the icon's state.
* @property helpTextResId The string resource ID for the detailed help text associated with this state.
* @property badgeIcon Optional vector graphic for a badge to be displayed on the icon.
* @property badgeIconColor Optional tint color for the badge icon.
*/
Tf0883e@Immutable
Tff7b72enum Tff7b72class T56d364SecurityStateTb4b4b4(
Tf0883e@Stable Tff7b72val Te6edf3iconTb4b4b4: Te6edf3DrawableResourceTb4b4b4,
Tf0883e@Stable Tff7b72val Te6edf3colorTb4b4b4: Tf0883e@Composable Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3ColorTb4b4b4,
Tff7b72val Te6edf3descriptionResIdTb4b4b4: Te6edf3StringResourceTb4b4b4,
Tff7b72val Te6edf3helpTextResIdTb4b4b4: Te6edf3StringResourceTb4b4b4,
Tf0883e@Stable Tff7b72val Te6edf3badgeIconTb4b4b4: Te6edf3DrawableResource? Tff7b72= Tff7b72nullTb4b4b4,
Tf0883e@Stable Tff7b72val Te6edf3badgeIconColorTb4b4b4: Tf0883e@Composable Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3Color? Tff7b72= Tb4b4b4{ Tff7b72null Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
T8b949e/** State for a secure channel (green lock). */
Te6edf3SECURETb4b4b4(
Te6edf3icon Tff7b72= Te6edf3ResTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3ic_lockTb4b4b4,
Te6edf3color Tff7b72= Tb4b4b4{ Te6edf3colorSchemeTb4b4b4.Te6edf3StatusGreen Tb4b4b4}Tb4b4b4,
Te6edf3descriptionResId Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_secureTb4b4b4,
Te6edf3helpTextResId Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_help_green_lockTb4b4b4,
Tb4b4b4)Tb4b4b4,

T8b949e/**
* State for an insecure channel, not used for precise location, and MQTT not the primary concern for a higher
* warning. (yellow open lock)
*/
Te6edf3INSECURE_NO_PRECISETb4b4b4(
Te6edf3icon Tff7b72= Te6edf3ResTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3ic_lock_openTb4b4b4,
Te6edf3color Tff7b72= Tb4b4b4{ Te6edf3colorSchemeTb4b4b4.Te6edf3StatusYellow Tb4b4b4}Tb4b4b4,
Te6edf3descriptionResId Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_insecure_no_preciseTb4b4b4,
Te6edf3helpTextResId Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_help_yellow_open_lockTb4b4b4,
Tb4b4b4)Tb4b4b4,

T8b949e/**
* State for an insecure channel with precise location enabled, but MQTT not causing the highest warning. (red open
* lock)
*/
Te6edf3INSECURE_PRECISE_ONLYTb4b4b4(
Te6edf3icon Tff7b72= Te6edf3ResTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3ic_lock_openTb4b4b4,
Te6edf3color Tff7b72= Tb4b4b4{ Te6edf3colorSchemeTb4b4b4.Te6edf3StatusRed Tb4b4b4}Tb4b4b4,
Te6edf3descriptionResId Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_insecure_precise_onlyTb4b4b4,
Te6edf3helpTextResId Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_help_red_open_lockTb4b4b4,
Tb4b4b4)Tb4b4b4,

T8b949e/**
* State indicating an insecure channel with precise location and MQTT enabled (red open lock with yellow warning
* badge).
*/
Te6edf3INSECURE_PRECISE_MQTT_WARNINGTb4b4b4(
Te6edf3icon Tff7b72= Te6edf3ResTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3ic_lock_openTb4b4b4,
Te6edf3color Tff7b72= Tb4b4b4{ Te6edf3colorSchemeTb4b4b4.Te6edf3StatusRed Tb4b4b4}Tb4b4b4,
Te6edf3descriptionResId Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_warning_precise_mqttTb4b4b4,
Te6edf3helpTextResId Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_help_warning_precise_mqttTb4b4b4,
Te6edf3badgeIcon Tff7b72= Te6edf3ResTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3ic_warningTb4b4b4,
Te6edf3badgeIconColor Tff7b72= Tb4b4b4{ Te6edf3colorSchemeTb4b4b4.Te6edf3StatusYellow Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4}

T8b949e/**
* Internal composable to display the security icon, potentially with a badge.
*
* @param icon The main vector graphic for the icon.
* @param mainIconTint The tint color for the main icon.
* @param contentDescription The accessibility description for the icon.
* @param modifier Modifier for this composable.
* @param badgeIcon Optional vector graphic for the badge.
* @param badgeIconColor Optional tint color for the badge icon.
*/
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffSecurityIconDisplayTb4b4b4(
Te6edf3iconTb4b4b4: Te6edf3ImageVectorTb4b4b4,
Te6edf3mainIconTintTb4b4b4: Te6edf3ColorTb4b4b4,
Te6edf3contentDescriptionTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3badgeIconTb4b4b4: Te6edf3ImageVector? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3badgeIconColorTb4b4b4: Te6edf3Color? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3BadgedBoxTb4b4b4(
Te6edf3badge Tff7b72= Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3badgeIcon Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3BadgeTb4b4b4(
Te6edf3containerColor Tff7b72= Te6edf3ColorTb4b4b4.Te6edf3TransparentTb4b4b4, T8b949e// Allows badgeIconColor to define appearance
Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3badgeIconTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_badge_warning_descriptionTb4b4b4)Tb4b4b4,
Te6edf3tint Tff7b72= Te6edf3badgeIconColor Tff7b72?: Te6edf3colorSchemeTb4b4b4.Te6edf3onErrorTb4b4b4, T8b949e// Default for contrast
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4, T8b949e// Adjusted badge icon size
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3imageVector Tff7b72= Te6edf3iconTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3contentDescriptionTb4b4b4, Te6edf3tint Tff7b72= Te6edf3mainIconTintTb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Determines the [SecurityState] based on channel properties. The priority of states is: MQTT warning, then secure,
* then insecure variations.
*
* @param isLowEntropyKey True if the channel uses a low entropy key (not securely encrypted).
* @param isPreciseLocation True if precise location is enabled.
* @param isMqttEnabled True if MQTT is enabled for the channel.
* @return The determined [SecurityState].
*/
Tff7b72private Tff7b72fun Td2a8ffdetermineSecurityStateTb4b4b4(
Te6edf3isLowEntropyKeyTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3isPreciseLocationTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3isMqttEnabledTb4b4b4: Tffa657BooleanTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3SecurityState Tff7b72= Tff7b72when Tb4b4b4{
Tff7b72!Te6edf3isLowEntropyKey Tff7b72-Tff7b72> Te6edf3SecurityStateTb4b4b4.Te6edf3SECURE
Te6edf3isMqttEnabled Tff7b72&Tff7b72& Te6edf3isPreciseLocation Tff7b72-Tff7b72> Te6edf3SecurityStateTb4b4b4.Te6edf3INSECURE_PRECISE_MQTT_WARNING
Te6edf3isPreciseLocation Tff7b72-Tff7b72> Te6edf3SecurityStateTb4b4b4.Te6edf3INSECURE_PRECISE_ONLY
Tff7b72else Tff7b72-Tff7b72> Te6edf3SecurityStateTb4b4b4.Te6edf3INSECURE_NO_PRECISE
Tb4b4b4}

T8b949e/**
* Displays an icon representing the security status of a channel. Clicking the icon shows a detailed help dialog.
*
* @param securityState The current [SecurityState] to display.
* @param baseContentDescription The base content description for the icon, to which the specific state description will
* be appended. Defaults to a generic security icon description.
* @param externalOnClick Optional lambda to be invoked when the icon is clicked, in addition to its primary action
* (showing a help dialog). This allows callers to inject custom side effects.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffSecurityIconTb4b4b4(
Te6edf3securityStateTb4b4b4: Te6edf3SecurityStateTb4b4b4,
Te6edf3baseContentDescriptionTb4b4b4: Tffa657String Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_descriptionTb4b4b4)Tb4b4b4,
Te6edf3externalOnClickTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3showHelpDialog Tff7b72by Te6edf3rememberSaveable Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3fullContentDescription Tff7b72= Te6edf3baseContentDescription Tff7b72+ Ta5d6ff"Ta5d6ff Ta5d6ff" Tff7b72+ Te6edf3stringResourceTb4b4b4(Te6edf3securityStateTb4b4b4.Te6edf3descriptionResIdTb4b4b4)

Te6edf3IconButtonTb4b4b4(
Te6edf3onClick Tff7b72= Tb4b4b4{
Te6edf3showHelpDialog Tff7b72= Tff7b72true
Te6edf3externalOnClickTff7b72?.Te6edf3invokeTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3SecurityIconDisplayTb4b4b4(
Te6edf3icon Tff7b72= Te6edf3vectorResourceTb4b4b4(Te6edf3securityStateTb4b4b4.Te6edf3iconTb4b4b4)Tb4b4b4,
Te6edf3mainIconTint Tff7b72= Te6edf3securityStateTb4b4b4.Te6edf3colorTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3fullContentDescriptionTb4b4b4,
Te6edf3badgeIcon Tff7b72= Te6edf3securityStateTb4b4b4.Te6edf3badgeIconTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3vectorResourceTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3badgeIconColor Tff7b72= Te6edf3securityStateTb4b4b4.Te6edf3badgeIconColorTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3showHelpDialogTb4b4b4) Tb4b4b4{
Te6edf3SecurityHelpDialogTb4b4b4(Te6edf3securityState Tff7b72= Te6edf3securityStateTb4b4b4, Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showHelpDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Overload for [SecurityIcon] that derives the [SecurityState] from boolean flags.
*
* @param isLowEntropyKey Whether the channel uses a low entropy key.
* @param isPreciseLocation Whether the channel has precise location enabled. Defaults to false.
* @param isMqttEnabled Whether MQTT is enabled for the channel. Defaults to false.
* @param baseContentDescription The base content description for the icon.
* @param externalOnClick Optional lambda to be invoked when the icon is clicked, in addition to its primary action
* (showing a help dialog). This allows callers to inject custom side effects.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffSecurityIconTb4b4b4(
Te6edf3isLowEntropyKeyTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3isPreciseLocationTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3isMqttEnabledTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3baseContentDescriptionTb4b4b4: Tffa657String Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_descriptionTb4b4b4)Tb4b4b4,
Te6edf3externalOnClickTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3securityState Tff7b72= Te6edf3determineSecurityStateTb4b4b4(Te6edf3isLowEntropyKeyTb4b4b4, Te6edf3isPreciseLocationTb4b4b4, Te6edf3isMqttEnabledTb4b4b4)
Te6edf3SecurityIconTb4b4b4(
Te6edf3securityState Tff7b72= Te6edf3securityStateTb4b4b4,
Te6edf3baseContentDescription Tff7b72= Te6edf3baseContentDescriptionTb4b4b4,
Te6edf3externalOnClick Tff7b72= Te6edf3externalOnClickTb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e/** Extension property to check if the channel uses a low entropy PSK (not securely encrypted). */
Tff7b72val Te6edf3ChannelTb4b4b4.Te6edf3isLowEntropyKeyTb4b4b4: Tffa657Boolean
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3settingsTb4b4b4.Te6edf3pskTb4b4b4.Te6edf3size Tff7b72<Tff7b72= T79c0ff1

T8b949e/** Extension property to check if the channel has precise location enabled. */
Tff7b72val Te6edf3ChannelTb4b4b4.Te6edf3isPreciseLocationTb4b4b4: Tffa657Boolean
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3settingsTb4b4b4.Te6edf3module_settingsTff7b72?.Te6edf3position_precision Tff7b72=Tff7b72= Te6edf3PRECISE_POSITION_BITS

T8b949e/** Extension property to check if MQTT is enabled for the channel. */
Tff7b72val Te6edf3ChannelTb4b4b4.Te6edf3isMqttEnabledTb4b4b4: Tffa657Boolean
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3settingsTb4b4b4.Te6edf3uplink_enabled

T8b949e/**
* Overload for [SecurityIcon] that takes a [Channel] object to determine its security state.
*
* @param channel The channel whose security status is to be displayed.
* @param baseContentDescription The base content description for the icon.
* @param externalOnClick Optional lambda for external actions, invoked when the icon is clicked.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffSecurityIconTb4b4b4(
Te6edf3channelTb4b4b4: Te6edf3ChannelTb4b4b4,
Te6edf3baseContentDescriptionTb4b4b4: Tffa657String Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_descriptionTb4b4b4)Tb4b4b4,
Te6edf3externalOnClickTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tff7b72= Te6edf3SecurityIconTb4b4b4(
Te6edf3isLowEntropyKey Tff7b72= Te6edf3channelTb4b4b4.Te6edf3isLowEntropyKeyTb4b4b4,
Te6edf3isPreciseLocation Tff7b72= Te6edf3channelTb4b4b4.Te6edf3isPreciseLocationTb4b4b4,
Te6edf3isMqttEnabled Tff7b72= Te6edf3channelTb4b4b4.Te6edf3isMqttEnabledTb4b4b4,
Te6edf3baseContentDescription Tff7b72= Te6edf3baseContentDescriptionTb4b4b4,
Te6edf3externalOnClick Tff7b72= Te6edf3externalOnClickTb4b4b4,
Tb4b4b4)

T8b949e/**
* Overload for [SecurityIcon] that enables recomposition when making changes to the [ChannelSettings].
*
* @param baseContentDescription The base content description for the icon.
* @param externalOnClick Optional lambda for external actions, invoked when the icon is clicked.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffSecurityIconTb4b4b4(
Te6edf3channelSettingsTb4b4b4: Te6edf3ChannelSettingsTb4b4b4,
Te6edf3loraConfigTb4b4b4: Te6edf3LoRaConfigTb4b4b4,
Te6edf3baseContentDescriptionTb4b4b4: Tffa657String Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_descriptionTb4b4b4)Tb4b4b4,
Te6edf3externalOnClickTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3channel Tff7b72= Te6edf3ChannelTb4b4b4(Te6edf3channelSettingsTb4b4b4, Te6edf3loraConfigTb4b4b4)
Te6edf3SecurityIconTb4b4b4(
Te6edf3isLowEntropyKey Tff7b72= Te6edf3channelTb4b4b4.Te6edf3isLowEntropyKeyTb4b4b4,
Te6edf3isPreciseLocation Tff7b72= Te6edf3channelTb4b4b4.Te6edf3isPreciseLocationTb4b4b4,
Te6edf3isMqttEnabled Tff7b72= Te6edf3channelTb4b4b4.Te6edf3isMqttEnabledTb4b4b4,
Te6edf3baseContentDescription Tff7b72= Te6edf3baseContentDescriptionTb4b4b4,
Te6edf3externalOnClick Tff7b72= Te6edf3externalOnClickTb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e/**
* Overload for [SecurityIcon] that takes an [AppOnlyProtos.ChannelSet] and a channel index. If the channel at the given
* index is not found, nothing is rendered.
*
* @param channelSet The set of channels.
* @param channelIndex The index of the channel within the set.
* @param baseContentDescription The base content description for the icon.
* @param externalOnClick Optional lambda for external actions, invoked when the icon is clicked.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffSecurityIconTb4b4b4(
Te6edf3channelSetTb4b4b4: Te6edf3ChannelSetTb4b4b4,
Te6edf3channelIndexTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3baseContentDescriptionTb4b4b4: Tffa657String Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_descriptionTb4b4b4)Tb4b4b4,
Te6edf3externalOnClickTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3channelSetTb4b4b4.Te6edf3getChannelTb4b4b4(Te6edf3channelIndexTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3channel Tff7b72-Tff7b72>
Te6edf3SecurityIconTb4b4b4(
Te6edf3channel Tff7b72= Te6edf3channelTb4b4b4,
Te6edf3baseContentDescription Tff7b72= Te6edf3baseContentDescriptionTb4b4b4,
Te6edf3externalOnClick Tff7b72= Te6edf3externalOnClickTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Overload for [SecurityIcon] that takes an [AppOnlyProtos.ChannelSet] and a channel name. If a channel with the given
* name is not found, nothing is rendered. This overload optimizes lookup by name by memoizing a map of channel names to
* settings.
*
* @param channelSet The set of channels.
* @param channelName The name of the channel to find.
* @param baseContentDescription The base content description for the icon.
* @param externalOnClick Optional lambda for external actions, invoked when the icon is clicked.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffSecurityIconTb4b4b4(
Te6edf3channelSetTb4b4b4: Te6edf3ChannelSetTb4b4b4,
Te6edf3channelNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3baseContentDescriptionTb4b4b4: Tffa657String Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_descriptionTb4b4b4)Tb4b4b4,
Te6edf3externalOnClickTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3channelByNameMap Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3channelSetTb4b4b4) Tb4b4b4{
Te6edf3channelSetTb4b4b4.Te6edf3settingsTb4b4b4.Te6edf3associateBy Tb4b4b4{ Te6edf3ChannelTb4b4b4(Tffa657itTb4b4b4, Te6edf3channelSetTb4b4b4.Te6edf3lora_config Tff7b72?: Te6edf3ChannelTb4b4b4.Te6edf3defaultTb4b4b4.Te6edf3loraConfigTb4b4b4)Tb4b4b4.Te6edf3name Tb4b4b4}
Tb4b4b4}

Te6edf3channelByNameMapTff7b72[Te6edf3channelNameTff7b72]Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3channelSetting Tff7b72-Tff7b72>
Te6edf3SecurityIconTb4b4b4(
Te6edf3channel Tff7b72= Te6edf3ChannelTb4b4b4(Te6edf3channelSettingTb4b4b4, Te6edf3channelSetTb4b4b4.Te6edf3lora_config Tff7b72?: Te6edf3ChannelTb4b4b4.Te6edf3defaultTb4b4b4.Te6edf3loraConfigTb4b4b4)Tb4b4b4,
Te6edf3baseContentDescription Tff7b72= Te6edf3baseContentDescriptionTb4b4b4,
Te6edf3externalOnClick Tff7b72= Te6edf3externalOnClickTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Displays a help dialog explaining the meaning of different security icons. The dialog can show details for a specific
* [SecurityState] or a list of all states.
*
* @param securityState The initial security state to display contextually.
* @param onDismiss Lambda invoked when the dialog is dismissed.
*/
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffSecurityHelpDialogTb4b4b4(Te6edf3securityStateTb4b4b4: Te6edf3SecurityStateTb4b4b4, Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3showAll Tff7b72by Te6edf3rememberSaveable Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}

Te6edf3AlertDialogTb4b4b4(
Te6edf3modifier Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3showAllTb4b4b4) Tb4b4b4{
Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3Modifier
Tb4b4b4}Tb4b4b4,
Te6edf3onDismissRequest Tff7b72= Te6edf3onDismissTb4b4b4,
Te6edf3title Tff7b72= Tb4b4b4{
Te6edf3TextTb4b4b4(
Tff7b72if Tb4b4b4(Te6edf3showAllTb4b4b4) Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_help_title_allTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_help_titleTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3showAllTb4b4b4) Tb4b4b4{
Te6edf3AllSecurityStatesTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3ContextualSecurityStateTb4b4b4(Te6edf3securityStateTb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3confirmButton Tff7b72= Tb4b4b4{
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3showAll Tff7b72= Tff7b72!Te6edf3showAll Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Tff7b72if Tb4b4b4(Te6edf3showAllTb4b4b4) Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_help_show_lessTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_help_show_allTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onDismissTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3security_icon_help_dismissTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e/**
* Displays details for a single, specific security state within the help dialog.
*
* @param securityState The state to display.
*/
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffContextualSecurityStateTb4b4b4(Te6edf3securityStateTb4b4b4: Te6edf3SecurityStateTb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4) Tb4b4b4{
Te6edf3SecurityIconDisplayTb4b4b4(
Te6edf3icon Tff7b72= Te6edf3vectorResourceTb4b4b4(Te6edf3securityStateTb4b4b4.Te6edf3iconTb4b4b4)Tb4b4b4,
Te6edf3mainIconTint Tff7b72= Te6edf3securityStateTb4b4b4.Te6edf3colorTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3securityStateTb4b4b4.Te6edf3descriptionResIdTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff4T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3badgeIcon Tff7b72= Te6edf3securityStateTb4b4b4.Te6edf3badgeIconTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3vectorResourceTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3badgeIconColor Tff7b72= Te6edf3securityStateTb4b4b4.Te6edf3badgeIconColorTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3securityStateTb4b4b4.Te6edf3helpTextResIdTb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Displays a list of all possible security states with their icons and descriptions within the help dialog. Iterates
* over `SecurityState.entries` which is provided by the enum class.
*/
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffAllSecurityStatesTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3verticalScrollTb4b4b4(Te6edf3rememberScrollStateTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3SecurityStateTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3state Tff7b72-Tff7b72>
T8b949e// Uses enum entries
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3SecurityIconDisplayTb4b4b4(
Te6edf3icon Tff7b72= Te6edf3vectorResourceTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3iconTb4b4b4)Tb4b4b4,
Te6edf3mainIconTint Tff7b72= Te6edf3stateTb4b4b4.Te6edf3colorTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3descriptionResIdTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff4T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3badgeIcon Tff7b72= Te6edf3stateTb4b4b4.Te6edf3badgeIconTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3vectorResourceTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3badgeIconColor Tff7b72= Te6edf3stateTb4b4b4.Te6edf3badgeIconColorTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3descriptionResIdTb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumTb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3helpTextResIdTb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3state Tff7b72!Tff7b72= Te6edf3SecurityStateTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3lastOrNullTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3HorizontalDividerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3top Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

T8b949e// Preview functions for development and testing

Tf0883e@PreviewTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffSecure Channel IconTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffPreviewSecureChannelTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{ Te6edf3SecurityIconTb4b4b4(Te6edf3securityState Tff7b72= Te6edf3SecurityStateTb4b4b4.Te6edf3SECURETb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffInsecure Precise IconTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffPreviewInsecureChannelWithPreciseLocationTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{ Te6edf3SecurityIconTb4b4b4(Te6edf3securityState Tff7b72= Te6edf3SecurityStateTb4b4b4.Te6edf3INSECURE_PRECISE_ONLYTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffInsecure Channel IconTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffPreviewInsecureChannelWithoutPreciseLocationTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{ Te6edf3SecurityIconTb4b4b4(Te6edf3securityState Tff7b72= Te6edf3SecurityStateTb4b4b4.Te6edf3INSECURE_NO_PRECISETb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffMQTT Enabled IconTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffPreviewMqttEnabledTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{ Te6edf3SecurityIconTb4b4b4(Te6edf3securityState Tff7b72= Te6edf3SecurityStateTb4b4b4.Te6edf3INSECURE_PRECISE_MQTT_WARNINGTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@PreviewTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffAll Security Icons with DialogTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffPreviewAllSecurityIconsWithDialogTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Tff7b72var Te6edf3showHelpDialogFor Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Te6edf3SecurityState?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3stateLabels Tff7b72= Te6edf3remember Tb4b4b4{
T8b949e// Using SecurityState.entries to build the map keys
Te6edf3mapOfTb4b4b4(
Te6edf3SecurityStateTb4b4b4.Te6edf3SECURE Te6edf3to Ta5d6ff"Ta5d6ffSecureTa5d6ff"Tb4b4b4,
Te6edf3SecurityStateTb4b4b4.Te6edf3INSECURE_NO_PRECISE Te6edf3to Ta5d6ff"Ta5d6ffInsecure (No Precise Location)Ta5d6ff"Tb4b4b4,
Te6edf3SecurityStateTb4b4b4.Te6edf3INSECURE_PRECISE_ONLY Te6edf3to Ta5d6ff"Ta5d6ffInsecure (Precise Location Only)Ta5d6ff"Tb4b4b4,
Te6edf3SecurityStateTb4b4b4.Te6edf3INSECURE_PRECISE_MQTT_WARNING Te6edf3to Ta5d6ff"Ta5d6ffInsecure (Precise Location + MQTT Warning)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffSecurity Icons Preview (Click for Help)Ta5d6ff"Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3headlineSmallTb4b4b4)

Te6edf3SecurityStateTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3state Tff7b72-Tff7b72>
T8b949e// Iterate over enum entries
Tff7b72val Te6edf3label Tff7b72= Te6edf3stateLabelsTff7b72[Te6edf3stateTff7b72] Tff7b72?: Ta5d6ff"Ta5d6ffUnknown State (Tffd700${Te6edf3stateTb4b4b4.Te6edf3nameTffd700}Ta5d6ff)Ta5d6ff" T8b949e// Fallback to enum name
Te6edf3RowTb4b4b4(
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3SecurityIconTb4b4b4(Te6edf3securityState Tff7b72= Te6edf3stateTb4b4b4, Te6edf3externalOnClick Tff7b72= Tb4b4b4{ Te6edf3showHelpDialogFor Tff7b72= Te6edf3state Tb4b4b4}Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3labelTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3showHelpDialogForTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3SecurityHelpDialogTb4b4b4(Te6edf3securityState Tff7b72= Tffa657itTb4b4b4, Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showHelpDialogFor Tff7b72= Tff7b72null Tb4b4b4}Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.11s